/* This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package Controlador;

import java.io.File;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.regex.Pattern;
import java.util.Vector;
import Modelo.*;

/**
 * Se le pasa una mascara de nombre de ficheros en formato regex de java
 * y busca, recursivamente o no, todos los ficheros que cumplen dicha mascara
 * @author Armando Machuca
 */
public class BuscadorDeFicheros
{
	/**
	 * Busca todos los ficheros que cumplen la m�scara que se le pasa y los
	 * mete en la listaFicheros que se le pasa.
         *
	 * @param pathInicial Path inicial de busqueda. 
	 * @param mascara Una mascara valida
	 * @param listaFicheros Una lista de ficheros a la que se anadiran los File
	 * que cumplan la mascara. 
	 * @param busquedaRecursiva Si la busqueda debe ser recursiva en todos los
	 * subdirectorios por debajo del pathInicial.
         * @param hash compara el hash con el del fichero
	 */
	public static void dameFicheros(String pathInicial, String mascara,
			LinkedList<File> listaFicheros, boolean busquedaRecursiva,String hash)
	{             
		File directorioInicial = new File(Tools.reemplazarVEntorno(pathInicial));


		if (directorioInicial.isDirectory())
		{
			File[] ficheros = directorioInicial.listFiles();

			if (ficheros!=null){
				for (int i = 0; i < ficheros.length; i++)
				{
					if (ficheros[i].isDirectory() && busquedaRecursiva)
						dameFicheros(ficheros[i].getAbsolutePath(), mascara,
								listaFicheros, busquedaRecursiva,hash);
					else if (Pattern.matches(mascara, ficheros[i].getName())){
						if(hash.length()<=0){
							listaFicheros.add(ficheros[i]);						
						}
						else{
							if((hash.compareTo(Hash.getMD5(ficheros[i].getAbsolutePath()))==0) || (hash.compareTo(Hash.getSHA(ficheros[i].getAbsolutePath()))==0)){
								listaFicheros.add(ficheros[i]);
							}
						}
					}
				}
			}
		}
	}

	/**
	 * Busca todos los ficheros que cumplen la mascara que se le pasa y los
	 * mete en la listaFicheros que se le pasa.
	 * 
	 * @param pathInicial Path inicial de busqueda. Debe ser un directorio que
	 * exista y con permisos de lectura.
	 * @param mascara Una mascara
         * @param listaFicheros Una lista de ficheros a la que se anaden los File
	 * que cumplan la mascara.
	 * @param busquedaRecursiva Si la b�squeda debe ser recursiva en todos los
	 * subdirectorios por debajo del pathInicial.
         * @param tec Vector de tecnicas para comprobar. Las mascaras que se comprobaran seran estas
	 */
	public static void dameMultiplesFicheros(String pathInicial, String mascara,
			LinkedList<File> listaFicheros, boolean busquedaRecursiva, Vector tec)
	{
		File directorioInicial = new File(Tools.reemplazarVEntorno(pathInicial));
		
		if (directorioInicial.isDirectory())
		{
			File[] ficheros = directorioInicial.listFiles();

			if (ficheros!=null){
				
				for (int i = 0; i < ficheros.length; i++)
				{
					
					if (ficheros[i].isDirectory() && busquedaRecursiva){
                        
						dameMultiplesFicheros(ficheros[i].getAbsolutePath(), mascara, listaFicheros, busquedaRecursiva, tec);

                    }
					else{
						Iterator it=tec.iterator();
						while(it.hasNext()){
							Tecnica p=(Tecnica)it.next();	
							
							if (Pattern.matches(dameRegex(p.getValue("nombre")), ficheros[i].getName())){
                                                            
								if(p.getValue("hash")==null || p.getValue("hash").length()<1){	
								p._resultados.add(new Parametro("archivo",ficheros[i].getAbsolutePath()));
								}
								else{
									if((p.getValue("hash").compareTo(Hash.getMD5(ficheros[i].getAbsolutePath()))==0) || (p.getValue("hash").compareTo(Hash.getSHA(ficheros[i].getAbsolutePath()))==0)){
										p._resultados.add(new Parametro("archivo",ficheros[i].getAbsolutePath()));
                                                                                
                                                                                      
									}
                                                                }
							}
						}
					}
				}
			}
		}
	}

	
     /**
     * Modifica la mascara para que funcione correctamente
     * @param mascara Mascara que se buscara
     * @return Mascara correcta
     */
	public static String dameRegex(String mascara)
	{
		mascara = mascara.replace(".", "\\.");
		mascara = mascara.replace("*", ".*");
		mascara = mascara.replace("?",".");
		return mascara;
	}
	

	
}